#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstdio>
#include <cstring>

// 分离状态 主线程不需要等待新线程
void *routine(void *args)
{
    int cnt = 5;
    while (cnt--)
    {
        std::cout << "这是一个新线程" << std::endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, routine, (void *)"thread-1");

    int cnt = 5;
    while (cnt--)
    {
        std::cout << "这是main新线程" << std::endl;
        sleep(1);
    }
    // 线程分离 detach
    pthread_detach(tid);
    // 分离之后主线程不需要等待也不能等待 那么此时join会出错
    void *ret = nullptr;
    int n = pthread_join(tid, &ret);
    if (n != 0)
    {
        std::cout << "pthread join error : " << strerror(n) << std::endl;
    }
    else
    {
        std::cout << "新线程退出, " << "返回值为 : " << (long long)ret << std::endl;
    }
    return 0;
}

// 线程终止
// 1、return就是终止
// 2、pthread_exit
// 3、线程取消
// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b) {}
//     ~Task() {}
//     int Execute()
//     {
//         return _a + _b;
//     }

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int res) : _res(res) {}
//     ~Result() {}
//     int Getres()
//     {
//         return _res;
//     }

// private:
//     int _res;
// };

// void *routine(void *args)
// {
//     Task *t = static_cast<Task *>(args);
//     sleep(1);
//     Result *res = new Result(t->Execute());
//     pthread_exit(res);
// }
// int main()
// {
//     pthread_t tid;
//     Task *t = new Task(10, 20);
//     pthread_create(&tid, nullptr, routine, t);
//     sleep(1);

//     //PTHREAD_CANCELED;
//     // 取消线程
//     pthread_cancel(tid);

//     void * ret = nullptr;
//     pthread_join(tid, &ret);
//     std::cout << "新线程退出, " << "返回值为 : " << (long long)ret << std::endl;

//     // Result *ret;
//     // pthread_join(tid, (void **)(&ret));
//     // std::cout << "新线程退出, " << "计算结果为 : " << ret->Getres() << std::endl;
//     return 0;
// }

// 验证create和join可以传和接收任意参数的类型
// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b) {}
//     ~Task() {}
//     int Execute()
//     {
//         return _a + _b;
//     }

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int res) : _res(res) {}
//     ~Result() {}
//     int Getres()
//     {
//         return _res;
//     }

// private:
//     int _res;
// };

// void *routine(void *args)
// {
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "这是一个新线程" << std::endl;
//         sleep(1);
//     }

//     Task *t = static_cast<Task *>(args);
//     sleep(1);
//     Result *res = new Result(t->Execute());
//     return res;
// }
// int main()
// {
//     pthread_t tid;
//     Task *t = new Task(10, 20);
//     pthread_create(&tid, nullptr, routine, t);

//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "这是main新线程" << std::endl;
//         sleep(1);
//     }

//     Result *ret;
//     pthread_join(tid, (void **)(&ret));
//     std::cout << "新线程退出, " << "计算结果为 : " << ret->Getres() << std::endl;
//     return 0;
// }